package com.cskaoyan._03innerclazz._03static._02basic;

/**
 * @description:
 * @author: 景天
 * @date: 2023/2/13 14:43
 **/
/*
静态内部类和外部类的关系?
    2个独立的类

静态内部类的访问特点
    内部类----->外部类
        普通方法: 创建外部类对象,通过对象.访问
        静态方法: 创建外部类对象,通过对象.访问
        不受权限控制
    外部类----->内部类
        普通成员方法: 创建内部类对象,通过对象.访问
        静态成员方法: 创建内部类对象,通过对象.访问
        不受权限控制
    内部类----->外部其他类
        创建外部其他类对象,通过对象.访问
        受权限控制
    外部其他类-->内部类
        创建内部类对象, 通过对象.访问
        Outer.Inner inner = new Outer.Inner();

 */
public class Demo {
    int a  =1;
    private String s = "aaaa";
    public static void main(String[] args) {
        //外部其他类-->内部类
        // 创建内部类对象
        Outer.Inner inner = new Outer.Inner();
        // 通过对象.访问
        System.out.println(inner.aa);
        inner.innerMethod2();
    }
}
// 外部类
class Outer{
    // 外部类的成员变量
    int a = 1;
    private int c = 1;

    static int b =2;

    // 外部类的成员方法
    public void outerNormalMethod() {
        // 外部类----->内部类
        // 创建内部类对象
        Inner inner = new Inner();
        // 普通成员访问
        System.out.println(inner.aa);

        // 静态成员变量访问
        System.out.println(Inner.s);

        // 成员方法访问
        inner.innerMethod2();
        // 静态方法的访问
        Inner.innerStaticMethod2();
    }

    // 外部类的静态方法
    public static void outerStaticMethod() {
        // 外部类----->内部类
        // 创建内部类对象
        Inner inner = new Inner();
        // 普通成员访问
        System.out.println(inner.aa);

        // 静态成员变量访问
        System.out.println(Inner.s);

        // 成员方法访问
        inner.innerMethod2();
        // 静态方法的访问
        Inner.innerStaticMethod2();
    }

    // 静态内部类
    static class Inner{
        // 静态内部类的成员
        // 成员变量
        int aa = 10;
        static String s = "abc";

        // 成员方法
        void innerMethod1() {
            // 内部类----->外部类
            // 创建外部类对象去访问
            Outer outer = new Outer();
            System.out.println(outer.a);
            System.out.println(outer.c);
            outer.outerNormalMethod();
            // 访问外部类的静态方法
            Outer.outerStaticMethod();
        }
        void innerMethod2() {
            // 内部类----->外部其他类
            // 创建外部其他类对象
            Demo demo = new Demo();
            // 通过对象.访问
            System.out.println(demo.a);
            // System.out.println(demo.s);
        }

        // 静态方法
        static void innerStaticMethod1() {
            // 内部类----->外部类
            // 创建外部类对象去访问
            Outer outer = new Outer();
            System.out.println(outer.a);
            System.out.println(outer.c);
            outer.outerNormalMethod();
            // 访问外部类的静态方法
            Outer.outerStaticMethod();

        }
        static void innerStaticMethod2() {

        }
    }
}